除了原生 DOM 事件,Vue 可以自定義事件,但只能作用在元件上。如果要在元件上使用原生事件,需要加 .native
修飾詞,普通元素上使用 .native
是無效的
元件透過 createComponent
創建 vnode
// src/core/vdom/create-component.js
export function createComponent (
Ctor: Class<Component> | Function | Object | void,
data: ?VNodeData,
context: Component,
children: ?Array<VNode>,
tag?: string
): VNode | Array<VNode> | void {
// ...
/************************************************************
data.on 賦值給 listeners
data.nativeOn 賦值給 data.on
原生 DOM 事件的處理是在當前元件環境
而自定義事件,
則因為把 listeners 作為 vnode 的 componentOptions 傳入,
componentOptions 是在子元件初始化階段處理,
所以自定義事件的處理是在子元件環境
*************************************************************/
const listeners = data.on
data.on = data.nativeOn
// ...
const name = Ctor.options.name || tag
const vnode = new VNode(
`vue-component-${Ctor.cid}${name ? `-${name}` : ''}`,
data, undefined, undefined, undefined, context,
{ Ctor, propsData, listeners, tag, children },
asyncFactory
)
return vnode
}